package com.xcoder.design_pattern.decorator;

/**
 * 装饰器模式
 * https://www.cnblogs.com/volcano-liu/p/10897897.html
 */
public class Decorator1 {

    public static void main(String[] args) {
        testSZB();

        System.out.println();

        testKLM();
    }

    private static void testSZB() {
        路边美食 szb = new 手抓饼();
        System.out.println("普通手抓饼：" + szb.cost() + "块");
        szb = new 加蛋装饰器(szb);
        System.out.println("普通手抓饼+蛋：" + szb.cost() + "块");
        szb = new 加烤肠装饰器(szb);
        System.out.println("普通手抓饼+蛋+烤肠：" + szb.cost() + "块");
    }

    private static void testKLM() {
        路边美食 klm = new 烤冷面();
        System.out.println("普通烤冷面：" + klm.cost() + "块");
        klm = new 加烤肠装饰器(klm);
        System.out.println("普通烤冷面+烤肠：" + klm.cost() + "块");
        klm = new 加烤肠装饰器(klm);
        System.out.println("普通烤冷面+两根烤肠：" + klm.cost() + "块");
    }
}

interface 路边美食 {
    int cost();
}

class 手抓饼 implements 路边美食 {
    @Override
    public int cost() {
        return 5;
    }
}

class 烤冷面 implements 路边美食 {
    @Override
    public int cost() {
        return 6;
    }
}

abstract class 路边美食装饰器 implements 路边美食 {
    protected 路边美食 meishi;

    public 路边美食装饰器(路边美食 meishi) {
        this.meishi = meishi;
    }
}

class 加蛋装饰器 extends 路边美食装饰器 {
    public 加蛋装饰器(路边美食 meishi) {
        super(meishi);
    }

    @Override
    public int cost() {
        return meishi.cost() + 1;
    }
}

class 加烤肠装饰器 extends 路边美食装饰器 {
    public 加烤肠装饰器(路边美食 meishi) {
        super(meishi);
    }

    @Override
    public int cost() {
        return meishi.cost() + 3;
    }
}